<?php

namespace app\common\model;

use app\common\util\ImageHelper;
use think\Model;
use lib\builtin\auth\HasPermissions;
use lib\builtin\auth\HasPermissionsInterface;

/**
 * @property int $id ID
 * @property string $username 用户名
 * @property string $password 密码（加密后）
 * @property string $realname 真实姓名
 * @property string $avatar 头像文件名
 * @property string $avatar_url 头像URL
 * @property string $avatar_path 头像物理路径
 * @property int $role 用户权限
 * @property bool $is_superadmin 是否是超级管理员
 * @property bool $is_active 是否启用
 * @property string $register_at 注册时间
 * @property string $last_login_at 最后登录
 */
class User extends Model implements HasPermissionsInterface
{
    use HasPermissions;

    // 数据表名
    protected $table = 'users';
    // 主键
    protected $pk = 'id';
    // 保存时自动补完
    protected $auto = [];
    // 新增时自动补完
    protected $insert = [];
    // 更新时自动补完
    protected $update = [];
    // 创建时间字段
    protected $createTime = 'register_at';
    // 更新时间字段
    protected $updateTime = 'last_login_at';
    // 是否需要自动写入时间戳
    protected $autoWriteTimestamp = true;
    // 类型声明
    protected $type = [
        'id'             => 'integer',
        'netid'          => 'string',
        'realname'       => 'string',
        'role'           => 'integer',
        'is_superadmin'  => 'boolean',
        'is_active'      => 'boolean',
        'register_at'    => 'datetime',
        'last_login_at'  => 'datetime',
    ];

    // 附加字段
    protected $append = ['avatar_url'];
    // 隐藏字段
    protected $hidden = ['password', 'avatar_path'];

    protected $avatarDir = 'avatar';

    /**
     * avatar_url属性
     */
    public function getAvatarUrlAttr()
    {
        if ($this->avatar) {
            return ImageHelper::urlRoot($this->avatarDir) . $this->avatar;
        } else {
            return null;
        }
    }

    /**
     * avatar_path属性
     */
    public function getAvatarPathAttr()
    {
        if ($this->avatar) {
            return ImageHelper::pathRoot($this->avatarDir) . $this->avatar;
        } else {
            return null;
        }
    }

    /**
     * 构建avatar属性值
     */
    public function buildAvatarName($ext)
    {
        return ImageHelper::buildUnusedName('U[id:3].[time:Ymd_His]_[rand:6].[ext]', [
            'id' => $this->id,
            'ext' => $ext,
            'dir' => $this->avatarDir
        ]);
    }

    /**
     * 当avatar存在时删除图片
     */
    public function removeAvatarIfExist()
    {
        $avatarPath = $this->avatar_path;
        if ($avatarPath && file_exists($avatarPath)) {
            @unlink($avatarPath);
        }
    }

    /**
     * 检查密码是否正确
     *
     * @param string $password 原始密码
     */
    public function checkPasswordValid($password)
    {
        return password_verify($password, $this->password);
    }

    /**
     * 设置用户密码
     *
     * @param string $password 原始密码
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = password_hash($password, PASSWORD_DEFAULT);
        return $this;
    }
}
